package com.deer.wms.ware.task.service;

import com.deer.wms.base.system.model.Area.AreaInfo;
import com.deer.wms.intercept.common.data.CurrentUser;
import com.deer.wms.inventory.model.Inventory.Inventory;
import com.deer.wms.project.root.service.SuperService;
import com.deer.wms.system.manage.model.user.UserInfo;
import com.deer.wms.ware.task.model.Wave.WaveDetail;
import com.deer.wms.ware.task.model.Wave.WaveDetailCriteria;
import com.deer.wms.ware.task.model.Wave.WaveDetailDto;
import com.deer.wms.ware.task.model.Wave.WaveMaster;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;


/**
 * @author wei
 * @date 2020/02/02
 */
public interface WaveDetailService extends SuperService<WaveDetail> {
    /**
     * 按条件查询波次明细
     *
     * @param criteria criteria
     * @return List<WaveDetailDto>
     */
    List<WaveDetailDto> findList(WaveDetailCriteria criteria);

    /**
     * 根据波次ID查询
     *
     * @param waveId
     * @return
     */
    List<WaveDetail> getByMasterId(Integer waveId);

    void deleteByWaveMasterId(Integer id);

    //=======如高的波次方法

    /**
     * 分配库管员以及拣货任务
     *
     * @param detailList  波次明细
     * @param wareUser    库管员
     * @param currentUser 当前用户
     */
    void suggestForPick(List<WaveDetail> detailList, UserInfo wareUser, CurrentUser currentUser);

    /**
     * 波次发货
     *
     * @param pickIds     拣货任务
     * @param currentUser 当前用户
     */
    Map<String, String> sendOut(List<Integer> pickIds, CurrentUser currentUser);

    /**
     * 同步最新的数据（如皋需求，因为可能期间发生变化）
     *
     * @param waveCode 波次号
     */
    void syncCurrentData(String waveCode);

//    OrderToErpBO getErpBean(Set<OutDetail> outDetails, String outBill);

    /**
     * 同步先发配件的数量（如皋需求）
     *
     * @param waveDetails 波次明细
     * @param id
     */
    List<WaveDetailDto> updateXfQuantity(List<WaveDetailDto> waveDetails, Integer id);


    /**
     * 修改状态跟数量
     *
     * @param waveDetail
     * @param vmiNumber
     */
    void updateState(WaveDetail waveDetail, Double vmiNumber);

    Double allInQty(List<Inventory> inventories, String itemCode,List<AreaInfo> areaInfos);
    /**
     * 批量回传ERP
     */
    void sendWaveDetail();

    /**
     * 修改任务单明细行
     * @param waveMaster
     */
    void updateTotalSkuCount(WaveMaster waveMaster);


    /**
     *
     * @param waveCode
     * @param httpServletResponse
     */
    void downLoad(String waveCode, HttpServletResponse httpServletResponse);
}
